/**
* @program: src
*
* @description:rpc中转函数
*
* @author: Mr.chen
*
* @create: 2020-12-16 14:28
**/
package mapper
import (
	"ydd-im/service/dbproxy/orm"
	"errors"

	"reflect"

)

var funcs = map[string]interface{}{
	"/user/login":  orm.Login,
	"/user/register":  orm.Register,
	"/user/getUserInfoByToken":  orm.GetUserInfoByToken,
	"/user/creategroup": orm.Creategroup,
	"/user/joingroup":orm.JoinGroup,
}

func FuncCall(name string, params ...interface{}) (result []reflect.Value, err error) {
	if _, ok := funcs[name]; !ok {
		err = errors.New("函数名不存在.")
		return
	}
	// 通过反射可以动态调用对象的导出方法
	f := reflect.ValueOf(funcs[name])
	if len(params) != f.Type().NumIn() {
		err = errors.New("传入参数数量与被调用方法要求的数量不一致.")
		return
	}

	// 构造一个 Value的slice, 用作Call()方法的传入参数
	in := make([]reflect.Value, len(params))
	for k, param := range params {
		in[k] = reflect.ValueOf(param)
	}

	// 执行方法f, 并将方法结果赋值给result
	result = f.Call(in)

	return
}